package bdsimple.impl.mysql;

import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import bdsimple.abstractfactory.AbstractFactoryDAO;
import bdsimple.dao.base.CiudadDAO;
import bdsimple.dao.base.CiudadDistanciaDAO;
import bdsimple.dto.base.CiudadDTO;
import bdsimple.dto.base.CiudadDistanciaDTO;
import dao.base.api.IDTO;
import dao.base.impl.Reference;

public class CiudadDistanciaDAOImpl extends MySQLBaseDAO implements
		CiudadDistanciaDAO {

	public CiudadDistanciaDAOImpl() {
		super(CiudadDistanciaDTO.class);
	}

	@Override
	protected String createInsertCollst(IDTO dto) throws Exception {

		StringBuffer strbuf = new StringBuffer();

		strbuf.append(CiudadDistanciaDTOImpl.DISTANCIA);
		strbuf.append(", ");
		strbuf.append(CiudadDistanciaDTOImpl.PRECIO_PASAJE);
		strbuf.append(", ");
		strbuf.append(CiudadDistanciaDTOImpl.CIUDAD_PARTIDA_REFERENCE);
		strbuf.append(", ");
		strbuf.append(CiudadDistanciaDTOImpl.CIUDAD_OBJETIVO_REFERENCE);

		return strbuf.toString();

	}

	@Override
	protected String createInsertValues(IDTO dto) throws Exception {

		CiudadDistanciaDTOImpl ciudadDistanciaDTOImpl = (CiudadDistanciaDTOImpl) dto;

		StringBuffer strbuf = new StringBuffer();

		strbuf.append(ciudadDistanciaDTOImpl.getDistancia());
		strbuf.append(", ");
		strbuf.append(ciudadDistanciaDTOImpl.getPrecioPasaje());
		strbuf.append(", ");

		Reference<CiudadDTO> ref = ciudadDistanciaDTOImpl
				.getCiudadDTORefPartida();
		ref.checkInsert();
		strbuf.append(ref.getIdAsString());
		strbuf.append(",");

		Reference<CiudadDTO> ref1 = ciudadDistanciaDTOImpl
				.getCiudadDTORefObjetivo();
		ref1.checkInsert();
		strbuf.append(ref1.getIdAsString());

		return strbuf.toString();

	}

	@Override
	protected String createTableColumns() throws Exception {

		CiudadDAO ciudadDAO = (CiudadDAO) //
		AbstractFactoryDAO.getFactoryDAO().getDAO( // 
				CiudadDAO.class, connectionBean);

		StringBuffer strbuf = new StringBuffer();

		strbuf.append(CiudadDistanciaDTOImpl.ID);
		strbuf.append(" INT PRIMARY KEY AUTO_INCREMENT, ");
		strbuf.append(CiudadDistanciaDTOImpl.DISTANCIA);
		strbuf.append(" INT, ");
		strbuf.append(CiudadDistanciaDTOImpl.PRECIO_PASAJE);
		strbuf.append(" INT, ");
		strbuf.append(CiudadDistanciaDTOImpl.CIUDAD_PARTIDA_REFERENCE);
		strbuf.append(" INT REFERENCES ");
		strbuf.append(ciudadDAO.getTableName());
		strbuf.append(",");
		strbuf.append(CiudadDistanciaDTOImpl.CIUDAD_OBJETIVO_REFERENCE);
		strbuf.append(" INT REFERENCES ");
		strbuf.append(ciudadDAO.getTableName());
		

		return strbuf.toString();

	}

	@Override
	protected String createUpdateValues(IDTO dto) throws Exception {

		CiudadDistanciaDTOImpl ciudadDistanciaDTOImpl = (CiudadDistanciaDTOImpl) dto;

		StringBuffer strbuf = new StringBuffer();

		strbuf.append(CiudadDistanciaDTOImpl.DISTANCIA);
		strbuf.append(" = ");
		strbuf.append(ciudadDistanciaDTOImpl.getDistancia());

		strbuf.append(", ");

		strbuf.append(CiudadDistanciaDTOImpl.PRECIO_PASAJE);
		strbuf.append(" = ");
		strbuf.append(ciudadDistanciaDTOImpl.getPrecioPasaje());

		strbuf.append(", ");

		strbuf.append(CiudadDistanciaDTOImpl.CIUDAD_PARTIDA_REFERENCE);
		strbuf.append(" = ");

		Reference<CiudadDTO> ref = ciudadDistanciaDTOImpl
				.getCiudadDTORefPartida();
		ref.checkUpdate();
		strbuf.append(ref.getIdAsString());

		strbuf.append(", ");

		strbuf.append(CiudadDistanciaDTOImpl.CIUDAD_OBJETIVO_REFERENCE);
		strbuf.append(" = ");

		Reference<CiudadDTO> ref1 = ciudadDistanciaDTOImpl
				.getCiudadDTORefPartida();
		ref1.checkUpdate();
		strbuf.append(ref1.getIdAsString());

		return strbuf.toString();

	}

	@Override
	protected IDTO internalResultSetToDTO(ResultSet rs, IDTO dto)
			throws Exception {

		CiudadDistanciaDTOImpl ret = (CiudadDistanciaDTOImpl) dto;

		ret.setId(rs.getInt(CiudadDistanciaDTOImpl.ID));
		ret.setDistancia(rs.getInt(CiudadDistanciaDTOImpl.DISTANCIA));
		ret.setPrecioPasaje(rs.getInt(CiudadDistanciaDTOImpl.PRECIO_PASAJE));

		Reference<CiudadDTO> ref = ret.getCiudadDTORefPartida();
		ref.setRefIdent(rs
				.getInt(CiudadDistanciaDTOImpl.CIUDAD_PARTIDA_REFERENCE));
		ref.setRefValue(null);

		Reference<CiudadDTO> ref1 = ret.getCiudadDTORefObjetivo();
		ref1.setRefIdent(rs
				.getInt(CiudadDistanciaDTOImpl.CIUDAD_OBJETIVO_REFERENCE));
		ref1.setRefValue(null);

		return ret;

	}

	// --------------------------------------------------------------------------------

	@Override
	public List<IDTO> listAll(int lim, int off) throws Exception {
		StringBuffer strbuf = new StringBuffer();

		strbuf.append("SELECT * FROM ");
		strbuf.append(getTableName());

		if (lim >= 0 && off >= 0) {
			strbuf.append(" LIMIT  ");
			strbuf.append(lim);
			strbuf.append(" OFFSET ");
			strbuf.append(off);
		}

		System.err.println(strbuf.toString());

		ResultSet rs = //
		connection.createStatement().executeQuery(strbuf.toString());

		List<IDTO> ret = new ArrayList<IDTO>();

		while (rs.next()) {
			ret.add(resultSetToDTO(rs));
		}

		return ret;
	}

	// --------------------------------------------------------------------------------

	public List<IDTO> listBy(String key, Object val) //
			throws Exception {

		if (key == null || val == null) {
			throw new IllegalArgumentException("key == null || val == null");
		}

		StringBuffer strbuf = new StringBuffer();

		strbuf.append("SELECT * FROM ");
		strbuf.append(getTableName());

		strbuf.append(" WHERE ");
		strbuf.append(key);
		strbuf.append(" = ");
		strbuf.append(val);

		System.err.println(strbuf.toString());

		ResultSet rs = //
		connection.createStatement().executeQuery(strbuf.toString());

		List<IDTO> ret = new ArrayList<IDTO>();

		while (rs.next()) {
			ret.add(resultSetToDTO(rs));
		}

		return ret;
	}
	
	public List<CiudadDistanciaDTO> listByCiudadIzqId(int id) throws Exception {

		StringBuffer strbuf = new StringBuffer();

		strbuf.append("SELECT * FROM ");
		strbuf.append(getTableName());

		strbuf.append(" WHERE ");
		strbuf.append(CiudadDistanciaDTO.CIUDAD_OBJETIVO_REFERENCE);
		strbuf.append(" = ");
		strbuf.append(id);

		System.err.println(strbuf.toString());

		ResultSet rs = //
			connection.createStatement().executeQuery(strbuf.toString());

		List<CiudadDistanciaDTO> ret = new ArrayList<CiudadDistanciaDTO>();

		while (rs.next()) {
			ret.add((CiudadDistanciaDTO) resultSetToDTO(rs));
		}

		return ret;
	}

}
